home *** CD-ROM | disk | FTP | other *** search
/ Amiga Packmags / Source, The - Issue 5 (1993)(Epsilon)[WB].zip / Source, The - Issue 5 (1993)(Epsilon)[WB].adf / Source / Vectors / Rendering / Ellipse.lha / circles.code next >
Internet Message Format  |  1989-10-24  |  5KB

  1. From albanycs!leah:rsb584 Sat Jan  9 02:42:36 1988
  2. Received: by albanycs.albany.edu (5.54/4.8)
  3.     id AA08556; Sat, 9 Jan 88 01:49:15 EST
  4. Date: Sat, 9 Jan 88 01:49:12 EST
  5. From: albanycs!leah:rsb584 ( Raymond S Brand)
  6. Received: by leah.Albany.EDU (5.58/1.1)
  7.     id AA04516; Sat, 9 Jan 88 01:49:12 EST
  8. Message-Id: <8801090649.AA04516@leah.Albany.EDU>
  9. To: albanycs:beowulf!rsbx
  10.  
  11. >From mcdonald@uxe.cso.uiuc.edu Wed Jan  6 12:31:00 1988
  12. Path: leah!uwmcsd1!bbn!oberon!bloom-beacon!gatech!purdue!i.cc.purdue.edu!j.cc.purdue.edu!pur-ee!uiucdcs!uxc.cso.uiuc.edu!uxe.cso.uiuc.edu!mcdonald
  13. From: mcdonald@uxe.cso.uiuc.edu
  14. Newsgroups: comp.graphics
  15. Subject: Re: circles with non-unity aspect ratio
  16. Message-ID: <46900007@uxe.cso.uiuc.edu>
  17. Date: 6 Jan 88 17:31:00 GMT
  18. References: <807@hsi.UUCP>
  19. Lines: 120
  20. Nf-ID: #R:hsi.UUCP:807:uxe.cso.uiuc.edu:46900007:000:3894
  21. Nf-From: uxe.cso.uiuc.edu!mcdonald    Jan  6 11:31:00 1988
  22.  
  23.  
  24. >I am trying to draw "good" circles on an AT&T 3b1 (aka, UNIX PC).
  25. >The problem is the aspect ratio - it is nowhere near unity.
  26. >I have gone through McIlroy's paper ("Best Approximate Circles on
  27. >Integer Grids") and Foley & Van Dam.  I see two ways to draw the circle:
  28.  
  29. >(1) Utilize "user coordinates" (in this case a 4096 by 4096 square)
  30.        Bad idea.
  31.  
  32. >(2) Utilize "device coordinates" (430 by 288, in this case).
  33.         The correct way.
  34.  
  35. >Am I missing something simple that would make it easy to draw my
  36. >circles ??  Can anyone point me to another reference that adequately
  37. >covers the drawing of a circle on a screen with a non-unity aspect
  38. >ratio (F & VD mention a few, but before I go digging up the articles,
  39. >does anyone know if these are what I should be looking at) ??
  40.  
  41. It's not really easy to generate good looking circles on a pixel grid.
  42. After trying lots of different things, I have adopted the following
  43. ellipse drawer. It draws ellipses in pixel space; to get circles you
  44. feed it the proper height and width in pixels. This thine works really
  45. well for circles with a radius greater than 4. For smaller circles,
  46. it pays in terms of looking nice to draw each size as a special case.
  47.  
  48. The enclosed program uses the standard Bresnahan algorithm for the
  49. best approximation of a curve. It is optimized for speed.
  50.  
  51. There was a good reference to this an article in Dr. Dobbs Journal in 1987,
  52. but for circles only, not ellipses.
  53.  
  54. I hope that this can help you.
  55.  
  56. Doug McDonald
  57. Department of Chemistry
  58. University of Illinois
  59.  
  60.  
  61. /* Draw an ellipse with width irx and height iry                         */
  62. /* from a routine by Tim Hogan in Dr. Dobb's Journal May '85 p.40        */
  63. /* Improved by calculating increments incrementally, thus removing all   */
  64. /* multiplies from the loops. These multiplies were very bad since they  */
  65. /* were (long)*(long).                                                   */
  66. /* Written Sept. 7, 1987 by J.D. McDonald (public domain)                */
  67.  
  68. static long     alpha, beta, alpha2, alpha4, beta2, beta4, d;
  69. static long     ddx, ddy, alphadx, betady;
  70. static int      dy, dx;
  71.  
  72. extern void     e_start(int, int, int ,int);
  73. extern void     e_xd();    
  74. extern void     e_xdyu();
  75. extern void     e_yu(); 
  76.  
  77. ellipse(x, y, irx, iry, c)
  78.     int             x, y, irx, iry;
  79.     unsigned        c;
  80. {
  81.  
  82.     beta = (long) irx *(long) irx;
  83.     alpha = (long) iry *(long) iry;
  84.  
  85.     if (alpha == 0L)
  86.     alpha = 1L;
  87.     if (beta == 0L)
  88.     beta = 1L;
  89.  
  90.     dy = 0;
  91.     dx = irx;
  92.     alpha2 = alpha << 1;
  93.     alpha4 = alpha2 << 1;
  94.     beta2 = beta << 1;
  95.     beta4 = beta2 << 1;
  96.     alphadx = alpha * dx;
  97.     betady = 0;
  98.     ddx = alpha4 * (1 - dx);
  99.     ddy = beta2 * 3;
  100.  
  101.     d = alpha2 * ((long) (dx - 1) * dx) + alpha + beta2 * (1 - alpha);
  102.     e_start(x - dx, x + dx, y, c);
  103.           /* e_start draws left and rightmost pixels on vertical centerline */
  104.           /* e_yu draws a pixel in right top quadrant one up from previous  */
  105.           /* e_xd draws a pixel in right top quadrant one left from previous*/
  106.           /* e_xdyu draws a pixel in right top quadrant up and left from    */
  107.           /* previous. e_yu, e_xd, and e_xdyu also draw the corresponding   */
  108.           /* pixels in the other three quadrants.                           */
  109.           /* c is the color                                                 */
  110.     do {
  111.     if (d >= 0) {
  112.         d += ddx;
  113.         dx--;
  114.         alphadx -= alpha;
  115.         ddx += alpha4;
  116.         e_xdyu();
  117.     } else
  118.         e_yu();
  119.     d += ddy;
  120.     dy++;
  121.     betady += beta;
  122.     ddy += beta4;
  123.     } while (alphadx > betady);
  124.  
  125.     d = beta2 * ((long) dy * (dy + 1)) + alpha2 * ((long) dx * (dx - 2) + 1) 
  126.     + beta * (1 - alpha2);
  127.     ddx = alpha2 * (3 - (dx << 1));
  128.     ddy = beta4 * (1 + dy);
  129.  
  130.     do {
  131.     if (d <= 0) {
  132.         d += ddy;
  133.         ddy += beta4;
  134.         dy++;
  135.         e_xdyu();
  136.     } else
  137.         e_xd();
  138.     d += ddx;
  139.     ddx += alpha4;
  140.     dx--;
  141.     } while (dx > 0);
  142. }
  143.  
  144.  
  145.